<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 一. 算术运算符的隐式类型转换  (+ - * /  %)
    // string -> number  
    // a. 字符串遇到 + 会拼接形成新的字符串
    // b. 字符串遇到 - * / %  会直接转化为数字
    //    (1)  纯数字类型的字符串  => 数字         "10"
    //    (1)  非纯数字类型的字符串  => NaN        "10a"

    // boolean -> number 
    // true  => 1
    // false => 0

    // null 和 undefined  转数字 
    // null => 0
    // undefined =>  NaN

    // 二. 关系运算符的隐式类型转换  (> >=  < <=   == ===)
    // 1. 字符串,布尔值 和 数字比较时,会先隐式的转化为数字 , 再比较
    // 2. 字符串和字符串比较时, 按照从左到右的顺序依次比较 ASCII码表(美国标准信息交换码)的大小
    // 3. null 和 undefined  在比较时
    //    (1)   null 和 undefined  遇到  > >= < <=  先转化为数字,再比较
    //    (2)   null 和 undefined  遇到  ==  !=    不会发生转化(没有可比性)  直接比较

    // 4. null和undefined 在数值上是相等的

    // 5. NaN和任何值都不相等   NaN != NaN


    // 三. 逻辑运算符的隐式类型转换  
    // console.log(!true);
    // console.log(!2);  // 2 => true  取反 => false

    // console.log(!!2);  // 2 => true  取反 => 取反 true   =>转布尔值等价于 Boolean(2)


    // 四. ++ -- 的隐式类型转换   (先将其他类型转化为数字  再自增)
    // string -> number  
    // a. 字符串遇到 + 会拼接形成新的字符串
    // b. 字符串遇到 - * / %  会直接转化为数字
    //    (1)  纯数字类型的字符串  => 数字         "10"
    //    (1)  非纯数字类型的字符串  => NaN        "10a"

    // boolean -> number 
    // true  => 1
    // false => 0

    // null 和 undefined  转数字 
    // null => 0
    // undefined =>  NaN

    // var a = 10;
    var a = "10";  // "10" => 10  自增=> 11
    var a = "10a";  // "10a" => NaN  自增=> NaN
    var a = "";  // "" => 0  自增=>  1 
    var a = true; // true => 1 自增 => 2
    var a = null; // null = > 0  自增 => 1
    var a = undefined;  // undefined  => NaN  自增=> NaN  
    console.log(a);

    a++;
    console.log(a);


  </script>
</body>

</html>